/**
 * 会话管理模块
 */
var _ljs=require("./mmlog").root("[sever/session.js]");
var nUtil=require("util");
var config = require("./config");
var util = require("./util");
var SIO = require("./socket");
var cache = new Map();
var queue = [];
var wxAPI = require("./channel/WeChat-API.js");
var _dbSession = require("./db/session.js");

module.exports = {
	/**
	 * 接受一个会话请求
	 * @param {Object} session
	 */
	acceptSession: function(session,callback) {
		var _this = this;
		if (cache.get(session.keyId)) {
			_ljs.error("会话已经存在:\n", session.keyId);
			callback && callback("当前会话尚未结束,无法再次进入人工!或者回复'#'关闭会话!");
			return false;
		}
		wxAPI.user(config.wechat("at"), session.from, function(user) {
			session.user = user;
			cache.set(session.keyId, session);
			_ljs.info("缓存会话\n", session);
			if (queue.length) {
				_this.pushQueue(session);
				callback && callback("当前客服繁忙!正在进行排队【"+queue.length+"】");
			} else {
				if (!agent.pushSession(session)) {
					_this.pushQueue(session);
					callback && callback("当前没有坐席在线!请稍等、或者回复'#'关闭会话!");
				} else {
					var _s = session;
					var t=new Date().getTime() + "";
					_s.startTime = t;
					callback && callback("工号【"+_s.jobId+"】为您服务!有什么可以帮助您的？");
					_dbSession.insertSession([_s.sessionId, _s.keyId, _s.jobId,_s.customer.id, _s.channel, _s.createTime,t,_s.from,_s.to,_s.business]);
				}
			}
		});
		return true;
	},
	
	loadUnfinishSession:function(jobId){
		var sessions=[];
		cache.forEach(function(value,key,_map){
			if(value.jobId==jobId){
				sessions.push(value);
			}
		})
		return sessions;
	},

	/**
	 * 关闭会话,或者移除会话
	 * @param {Object} keyId
	 */
	closeSession: function(keyId) {
		var s = cache.get(keyId);
		var j=s.jobId;
		if(s){
			wxAPI.reply(s.from, {
				type: "text",
				content: "退出人工服务、谢谢您的使用"
			});
			_dbSession.updateSession("STATUS", 2, s.sessionId);
			_dbSession.updateSession("END_TIME", new Date().getTime(), s.sessionId);
			cache.delete(keyId);
			this.delSessionFromQueue(keyId);
			_ljs.debug("正在处理的会话:", cache.size);
		}else{
			_ljs.error("非人工服务状态、或者会话已关闭")
		}
		agent.count(j,-1);
		this.one(j);
	},

	clear: function() {
		cache.clear();
		queue = [];
	},

	pushQueue: function(session) {
		queue.push(session);
		_ljs.debug("当前会话排队数:\n", queue.length);
	},
	removeQueue: function() {
		queue.shift();
		_ljs.debug("当前会话排队数:\n", queue.length);
	},
	
	delSessionFromQueue: function(keyId) {
		queue=queue.filter(function(item,index,_array){
			return item.keyId==keyId?false:true;
		})
		_ljs.debug("当前会话排队数:\n", queue.length);
	},

	updateCustomer:function(keyId,data){
		var c=cache.get(keyId).customer;
		for(var p in data){
			if(data.hasOwnProperty(p)){
				c[p]=data[p]
			}
		}
	},
	/**
	 * 分配一个会话给坐席
	 * @param {Object} jobId
	 */
	one: function(jobId,business) {
		_ljs.info(nUtil.format("坐席[%s]尝试获取一个会话",jobId));
		var _s=null;
		for(var i=0,size=queue.length;i<size;i++){
			if(queue[i].business==business){
				_s=queue[i];
				break
			}
		}
		
		if (_s) {
			_s.status = 1;
			_s.jobId = jobId;
			SIO.session(jobId, _s);
			this.removeQueue();
			var t=new Date().getTime() + "";
			_s.startTime = t;
			_dbSession.insertSession([_s.sessionId, _s.keyId, jobId,_s.customer.id, _s.channel, _s.createTime, t,_s.from,_s.to,_s.business]);
			wxAPI.reply(_s.from, {
				type: "text",
				content: "工号【"+jobId+"】为您服务!有什么可以帮助您的？"
			});
			_ljs.debug("获取一个会话:\n",_s);
		} else {
			_ljs.info("当前没有会话");
		}
	},
	/**
	 * 通过KEY_ID 获取会话
	 * @param {Object} keyId
	 */
	getSessionByKeyId: function(keyId) {
		return cache.get(keyId);
	},

	/**
	 * 查询所有会话信息
	 */
	query: function() {
		var a = [];
		cache.forEach(function(v, k, m) {
			a.push(v);
		})
		return a;
	},
	
	submitSummary:function(data,callback){
		var param=[util.rid(),data.sessionId,data.keyId,new Date().getTime(),data.subject,data.descr,data.solution,data.status];
		_dbSession.insertSummary(param,function(result){
			if(result==-1){
				callback(util.result(101003));	
			}else{
				callback(util.result(0));	
			}
		});
	},
	
	sessionReport:function(type,callback){
		_dbSession.sessionReport(type,callback);
	}

}

var agent = require("./agent");